package com.atguigu.seckill.scheduled;

import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;


/**
 * description: HelloScheduled
 * date: 2023/1/3 19:53
 * author: MR.孙
 *
 * 定时任务
 *      1、 @EnableScheduling 开启定时任务
 *      2、 @Scheduled开启一个定时任务
 *      3、 自动配置类 TaskExecutionAutoConfiguration
 *
 * 异步任务
 *      1、 @EnableAsync 开启异步任务功能
 *      2、 @Async给希望异步执行的方法上标注
 *      3、 自动配置类    TaskExecutionAutoConfiguration
 */
/*@EnableScheduling
@EnableAsync*/
@Slf4j
@Component
public class HelloScheduled {

    /**
     * 1、 Spring中cron表达式由6位组成，不允许第七位的年
     * 2、 在周几的位置上和普通的cron表达式不一样， 1-7代表的周一到周日而不是1代表周日， 也可以使用MON-SUN
     * 3、 定时任务不应该阻塞，默认是阻塞的。
     *解决办法:
     *      1)、 可以让业务运行以异步的方式，自己提交到线程池
             CompletableFuture.runAsync(()->{
             xxxService.hell();
             }, new ThreadPoolExecutor(,,,,,,,));
            2)、 支持定时任务线程池；TaskExecutionAutoConfiguration配置类读取TaskSchedulingProperties的配置
                spring.task.scheduling.pool.size=5
            3)、让定时任务异步执行
                异步任务:
                解决: 使用异步+定时任务来完成定时任务不阻塞的功能
     */
    /*    @Async
        @Scheduled(cron = "* * * * * ?")
        public void hello() throws InterruptedException {
            log.info("hello world!");
            Thread.sleep(3000);
        }*/

}
